Nachbesserungsarbeiten System-DB nach einspielen neuer Mandanten-DBs
Alle ungültigen IDs entfernen
| UPDATE peSET pe.PE_US_ID = NULLFROM NET_PERSON pe LEFT OUTER JOIN CP_USER us ON pe.PE_US_ID = us.US_IDWHERE pe.PE_US_ID IS NOT NULL AND us.US_ID IS NULLUPDATE staSET sta.US_ID = NULLFROM NET_STAMMDATEN sta LEFT OUTER JOIN CP_USER us ON sta.US_ID = us.US_IDWHERE sta.US_ID IS NOT NULL AND us.US_ID IS NULL |
|---|
Jeder CP-Mitarbeiter muss sich die Person zu seinem Benutzer am besten wieder selber anlegen.
Ausstattungen passen nicht mehr mit dem Ausstattungskstalog zusammen
- bei allen bestehenden Ausstattungen im Katalog die AU_GRUPPE mit einem eindeutigen Präfix versehen - z.B. ‘ALTDATEN - ‘
- Je Kunde von dem wir eine Datenbank haben mittels GenerateUpdateScript die Inhalte folgender Tabellen (in dieser Reihenfolge) bei uns einspielen
-
NET_AUSSTATTUNG_OENORM
-
NET_AUSSTATTUNG_OENORM_NAME
-
NET_AUSSTATTUNG_OENORM_KRITERIUM
-
NET_AUSSTATTUNG
- Nach jedem Mandanten jeweils die AU_GRUPPE mit dem Mandantenpräfix aktualisieren.
z.B.
UPDATE NET_AUSSTATTUNG
SET AU_GRUPPE = 'GSW - '
WHERE AU_GRUPPE NOT LIKE 'ALTDATEN - '
AND AU_GRUPPE NOT LIKE 'GSW - '
damit sieht man später an der AU_GRUPPE von welchem Kunden die Daten kommen
- Nach jedem Mandanten jeweils die AU_GRUPPE mit dem Mandantenpräfix aktualisieren.
-
NET_AUSSTATTUNG_INSTANDH_ART
-
NET_AUSSTATTUNG_INSTANDH
-
NET_AUSSTATTUNG_INSTANDH_KRITERIUM
-
- die in Punkt 1 durchgeführte Namensänderung zum Schluss wieder rückgängig machen
UPDATE NET_AUSSTATTUNG
SET AU_GRUPPE = REPLACE(AU_GRUPPE,'ALTDATEN - ','') - Die zugeordneten Ausstattungen ebenfalls korrigieren.
| UPDATE azSET az.AZ_GRUPPE = au.AU_GRUPPEFROM NET_AUSSTATTUNG_ZU az INNER JOIN net_ausstattung au ON az.AU_ID = au.AU_IDWHERE az.AZ_GRUPPE <> au.AU_GRUPPE |
|---|
Indiv-Felder stimmen nicht mehr
Die Konfiguration der Indiv-Felder (NET_EIGENSCHAFT / System-DB) stimmt nicht mehr mit den vorhandenen Feldern in den Mandanten-DBs zusammen
- Die bestehende Konfiguration ist hinfällig und muss daher komplett raus
| DELETE FROM NET_EIGENSCHAFT_GRUPPE_ZUDELETE FROM NET_EIGENSCHAFT_GRUPPEDELETE FROM NET_EIGENSCHAFT_MANDANTDELETE FROM NET_EIGENSCHAFT |
|---|
- Kopieren der Inhalte der NET_EIGENSCHAFT von den verschiedenen Kunden. Problematik hierbei: Wir haben ein UNIQUE-Constraint auf EIG_FREMD_ID - EIG_TABELLE - EIG_FELD_NAME. Hier kann es beim Einspielen von Kundendaten zu konflikten kommen, wenn zu von uns ausgelieferten Ausstattungen (=identische EIG_FREMD_ID) das gleiche Indiv-Feld angelegt wurde (z.B. INDIV_TYP).
Vermutlich ist es am einfachsten, die Datensätze mit Konflikt einfach nicht zu importieren. - Für den Abgleich einen beliebigen Indiv-Felder-Listendialog öffnen und “Sync Felder” betätigen. Damit sollten alle Mandanten abgeglichen sein.
Tabellen / Spalten in allen Mandanten übereinstimmend
Da wir Tabellen von 3 verschiedenen Kunden kopieren, gibt es in jedem Mandanten Eigenheiten die entfernt werden sollten
| SET NOCOUNT ONCREATE TABLE #tabellen( TABELLE varchar(255) COLLATE DATABASE_DEFAULT, ANZAHL integer DEFAULT 0)CREATE TABLE #spalten( TABELLE varchar(255) COLLATE DATABASE_DEFAULT, SPALTE varchar(255) COLLATE DATABASE_DEFAULT, ANZAHL integer DEFAULT 0)CREATE TABLE #DBs( DB varchar(50))INSERT INTO #DBs( DB)VALUES( 'StandardKunde_GSW')INSERT INTO #DBs( DB)VALUES( 'StandardKunde_NHT')INSERT INTO #DBs( DB)VALUES( 'StandardKunde_WAG')DECLARE DB_CURSOR CURSOR FOR( SELECT DB FROM #DBs)DECLARE @SQL nvarchar(MAX)DECLARE @DB varchar(50)OPEN DB_CURSORFETCH NEXT FROM DB_CURSOR INTO @DBWHILE @@FETCH_STATUS = 0BEGIN SET @SQL = N' --Update Tabellen die vorhanden sind UPDATE tmp SET ANZAHL = ANZAHL + 1 FROM #tabellen tmp INNER JOIN ['+@DB+'].[dbo].sysobjects obj ON tmp.TABELLE = obj.name --Insert Tabellen die noch fehlen INSERT INTO #tabellen( TABELLE, ANZAHL ) SELECT obj.name as TABELLE, 1 AS ANZAHL FROM ['+@DB+'].[dbo].sysobjects obj LEFT OUTER JOIN #spalten tmp ON obj.name = tmp.TABELLE WHERE tmp.TABELLE IS NULL AND OBJECTPROPERTY (obj.id,N''IsUserTable'') = 1 AND ( obj.name LIKE ''NET[_]%'' OR obj.name LIKE ''CP[_]%'' ) --Update Spalten die vorhanden sind UPDATE tmp SET ANZAHL = ANZAHL + 1 FROM #spalten tmp INNER JOIN ['+@DB+'].[dbo].sysobjects obj ON tmp.TABELLE = obj.name INNER JOIN ['+@DB+'].[dbo].syscolumns col ON obj.id = col.id AND tmp.SPALTE = col.name --Insert Spalten die noch fehlen INSERT INTO #spalten( TABELLE, SPALTE, ANZAHL ) SELECT obj.name as TABELLE, col.name as SPALTE, 1 AS ANZAHL FROM ['+@DB+'].[dbo].sysobjects obj INNER JOIN ['+@DB+'].[dbo].syscolumns col ON obj.id = col.id LEFT OUTER JOIN #spalten tmp ON obj.name = tmp.TABELLE AND col.name = tmp.SPALTE WHERE tmp.TABELLE IS NULL AND OBJECTPROPERTY (obj.id,N''IsUserTable'') = 1 AND ( obj.name LIKE ''NET[_]%'' OR obj.name LIKE ''CP[_]%'' ) ' exec sp_executeSQL @SQL FETCH NEXT FROM DB_CURSOR INTO @DBENDCLOSE DB_CURSORDEALLOCATE DB_CURSORDELETE FROM #tabellenWHERE ANZAHL = (SELECT COUNT(*) FROM #DBs)DELETE FROM #spaltenWHERE ANZAHL = (SELECT COUNT(*) FROM #DBs)SET NOCOUNT OFFDECLARE @TABELLE varchar(255)DECLARE @SPALTE varchar(255)DECLARE DELETE_TABLE_CURSOR CURSOR FOR SELECT TABELLE FROM #tabellenOPEN DELETE_TABLE_CURSORFETCH NEXT FROM DELETE_TABLE_CURSOR INTO @TABELLEWHILE @@FETCH_STATUS = 0BEGIN print 'exec dbo.CP_UPDATE_DELETE_TABLE ''dbo'', '''+@TABELLE+'''' FETCH NEXT FROM DELETE_TABLE_CURSOR INTO @TABELLEENDCLOSE DELETE_TABLE_CURSORDEALLOCATE DELETE_TABLE_CURSORDECLARE DELETE_COLUMN_CURSOR CURSOR FOR SELECT sp.TABELLE, sp.SPALTE FROM #spalten sp LEFT OUTER JOIN #tabellen tb ON sp.TABELLE = tb.TABELLE WHERE tb.TABELLE IS NULLOPEN DELETE_COLUMN_CURSORFETCH NEXT FROM DELETE_COLUMN_CURSOR INTO @TABELLE, @SPALTEWHILE @@FETCH_STATUS = 0BEGIN print 'exec dbo.CP_UPDATE_DELETE_FIELD ''dbo'', '''+@TABELLE+''', '''+@SPALTE+'''' FETCH NEXT FROM DELETE_COLUMN_CURSOR INTO @TABELLE, @SPALTEENDCLOSE DELETE_COLUMN_CURSORDEALLOCATE DELETE_COLUMN_CURSORDROP TABLE #spaltenDROP TABLE #tabellenDROP TABLE #DBs |
|---|
- Entfernen aller Tabellen, die nicht in allen Mandanten vorkommen (Altlasten, Backup-Tabellen, etc.)
- Entfernen aller Spalten die nicht in allen Mandanten vorkommen (Temporäre KZ, etc.)
o.g. Script generiert hierfür automatisch die entsprechenden SQL-Anweisungen.
Funktionskatalog passt nicht mehr mit den Funktionszuordnungen zusammen
Analog zu Ausstattungskatalog:
- Je Kunde von dem wir eine Datenbank haben mittels GenerateUpdateScript die Inhalte bei uns einspielen (‘FU_NUMMER’ unter “Prüfung auf Spalte” eintragen, damit Nummern nicht doppelt angelegt werden!)